\section{A program célja}
Szakdolgozatom keretében egy grafikus alkalmazást készítettem, amelynek segítségével bemutatom a transzformációk hatásait, valamint a párhuzamosítás során bekövetkezett sebesség változást.

A program a következőket nyújtja:
\begin{itemize}
	\item Kép betöltése
	\item Új kép előállítása az eredeti transzformálásával
	\item Transzformált kép mentése
	\item OpenCL platform beállítása
	\item A transzformációkhoz szükséges idő mérése
	\item A transzformációkról nyert adatok tárolása egy táblázatban
\end{itemize}

\section{Rendszerkövetelmények}
A párhuzamos transzformáció kihasználáshoz szükség van egy OpenCL kompatibilis hardverre. A mai CPU (Central Processing Unit), APU (Accelerated Processing Unit), GPU (Graphics Processing Unit) eszközök nagy százaléka támogatja ezt a rendszert. Bővebb információkért érdemes a gyártó honlapján, az adott hardver specifikációjában ezt megnézni.

Amennyiben nincs OpenCL kompatibilis hardver a számítógépben, a szekvenciális implementáció segítségével végezhetünk transzformációkat.

\subsection{Memória}
A program indításához nem szükséges nagy méretű memória, azonban a képek memóriában való tárolásához elengedhetetlen a megfelelő mennyiségű memória.

Minél nagyobb képekkel szeretnénk dolgozni, annál több memóriát emészt fel a program a működése során. Amennyiben a program nem képes végrehajtani műveleteket a memória hiánya miatt, bővítés lehet szükséges.

Ajánlott: legalább 4 GB memória.

\section{A program üzembe helyezése}
A program Windows és Linux operációs rendszer alatt is működik.

\subsection{Windows}
A program futtatásához a következő dll fájlok meglétére van szükség:
\begin{itemize}
	\item \verb|opencl.dll|
	\item \verb|qt5core.dll|
	\item \verb|qt5gui.dll|
	\item \verb|qt5widgets.dll|
	\item \verb|libgcc_s_dw2-1.dll|
	\item \verb|kernel32.dll|
	\item \verb|msvcrt.dll|
	\item \verb|libstdc++-6.dll|
\end{itemize}
A további dll fájlok a program könyvtárában találhatóak.

\subsection{Linux}
A Linuxos verzió csak 64 bites operációs rendszeren működik.

A következő csomagok megléte szükséges:
\begin{multicols}{2}
\begin{itemize}
	\item \verb|linux-vdso.so.1|
	\item \verb|libOpenCL.so.1|
	\item \verb|libQt5Widgets.so.5|
	\item \verb|libQt5Gui.so.5|
	\item \verb|libQt5Core.so.5|
	\item \verb|libpthread.so.0|
	\item \verb|libstdc++.so.6|
	\item \verb|libgcc_s.so.1|
	\item \verb|libc.so.6|
	\item \verb|libdl.so.2|
	\item \verb|libgobject-2.0.so.0|
	\item \verb|libglib-2.0.so.0|
	\item \verb|libX11.so.6|
	\item \verb|libm.so.6|
	\item \verb|libGL.so.1|
	\item \verb|libicui18n.so.51|
	\item \verb|libicuuc.so.51|
	\item \verb|libgthread-2.0.so.0|
	\item \verb|librt.so.1|
	\item \verb|libffi.so.6|
	\item \verb|libpcre.so.3|
	\item \verb|libxcb.so.1|
	\item \verb|libXext.so.6|
	\item \verb|libicudata.so.51|
	\item \verb|libXau.so.6|
	\item \verb|libXdmcp.so.6 |
\end{itemize}
\end{multicols}

\section{A program futtatása}
A programot az \verb|image-manipulation| futtatható állománnyal indíthatjuk.

\section{A program használata}

A program kezdőképernyője:

\begin{figure}[H]
	\includegraphics[width = \linewidth]{pics/kepernyokep/start.png}
	\caption{Kezdőképernyő}
\end{figure}

\subsection{A program felépítése}
\begin{itemize}
	\item Menü
	\begin{description}
		\item[File] \textbackslash
		\begin{description}
			\item[Load image] Kép betöltése
			\item[Save image] Transzformált kép mentése
			\item[OpenCL] OpenCL platform beállítása
			\item[Quit] Kilépés
		\end{description}
		\item[Filters] Kép betöltése után válik aktívvá, lásd a 2.5 ábrát
		\item[About] A program névjegye
	\end{description}
	\item Eszköztár
		\begin{description}
			\item \verb|+| : Kép(ek) nagyítása
			\item \verb|-| : Kép(ek) kicsinyítése
			\item \verb|0| : Nagyítás mértékének visszaállítása a kezdeti értékre
			\item \verb|<-| : A transzformált kép felhasználása további transzformálás céljára
		\end{description}
	\item Táblázat
		\begin{description}
			\item[Width] A transzformált kép szélessége
			\item[Height] A transzformát kép magassága
			\item[Transformation] Filter algoritmus
			\item[Parallel?] A transzformáció párhuzamos algoritmust használt-e
			\item[ms] A transzformáció hány milliszekundumig tartott
		\end{description}
	\item Státuszsor
	\begin{itemize}
		\item Platform információ
		\item Folyamatjelző
		\item \verb|Cancel| megszakítógomb
	\end{itemize}
\end{itemize}

\subsection{Kép betöltése}
A program JPG és BMP formátumú képek betöltését és transzformálást támogatja.

Kép betöltéséhez válasszuk a \verb|File\Load image| menüpontot.

Sikeres betöltés után a következő kép fogad:

\begin{figure}[H]
	\includegraphics[width = \linewidth]{pics/kepernyokep/kep_betoltve.png}
	\caption{Kép betöltése után}
\end{figure}

A betöltött képen tetszőlegesen nagyíthatunk. Ha a kép nem fér el az őt körülölelő területen, görgetősávok jelennek meg.

Nagyításra használhatjuk az egér görgőjét is.
\begin{itemize}
	\item Felfelé görgetés: nagyítás
	\item Lefelé görgetés: kicsinyítés
\end{itemize}

\subsection{Platform beállítása}
Platform beállításához használjuk a \verb|File\OpenCL| menüpontot.

A következő dialógusablak jelenik meg:

\begin{figure}[H]
	\centering
	\includegraphics{pics/kepernyokep/opencl_dialog.png}
	\caption{OpenCL beállító ablak}
\end{figure}

Részei: 
\begin{itemize}
	\item OpenCL platform be\textbackslash kikapcsolása
	\item Elérhető platformok
	\item A kiválasztott platformon elérhető eszközök
	\item Elfogadógomb
\end{itemize}
A 2.3 ábrán például a platform az \verb|AMD Accelerated Parallel Processing|, az eszköz az \verb|AMD Athlon(tm) II P320 Dual-Core Processor|.

Előfordulhat, hogy az adott rendszeren több platform, azon belül is több eszköz áll rendelkezésre. Ekkor a listából egy platformot, azon belül egy eszközt választhatunk ki.

Platform váltás után a főablak státuszsorán is látjuk a változást.

\begin{figure}[H]
	\includegraphics[width = \linewidth]{pics/kepernyokep/platform_beallitva.png}
	\caption{OpenCL beállítás után a megváltozott státusz sor}
\end{figure}

\subsection{Transzformálás}
Betöltött kép esetén aktívvá válik a \verb|Filters| menüpont, melynek elemei:
\begin{description}
	\item[Find edges] Élkeresés
		\begin{description}
			\item[Horizontal edges] Horizontális élek
			\item[Vertical edges] Vertikális élek
			\item[45 degree edges] 45 fokos élek
			\item[All edges] Minden él
		\end{description}
	\item[Blur] Elmosás
	\item[Motion blur] Mozgó elmosás
	\item[Sharpen] Élesítés
	\item[Excessive edges] Túlzó élek
	\item[Emboss] Dombornyomat
\end{description}

\begin{figure}[H]
	\includegraphics[width = \linewidth]{pics/kepernyokep/filter_menu.png}
	\caption{Filterek}
\end{figure}

\subsubsection{Elmosás}
Az elmosás mértékét paraméterezhetjük a további dialógusablak segítéségvel:

\begin{figure}[H]
	\centering
	\includegraphics{pics/kepernyokep/blur_dialog.png}
	\caption{Elmosás beállítása}
\end{figure}

A megjelenített kép a betöltött kép kicsinyített verziója, csak a transzformálás hatását hivatott bemutatni, a keletkező kép az előnézettől eltérő lehet. Az elmosás például nagyobb képen csak nagyítás után kivehető.

\subsubsection{Mozgó elmosás}
Ezt a transzformációt az elmosáshoz hasonlóan paraméterezhetjük, megadhatjuk az elmosás irányát.

\begin{figure}[H]
	\centering
	\includegraphics{pics/kepernyokep/motion_blur_dialog.png}
	\caption{Mozgó elmosás beállítása}
\end{figure}

\subsubsection{Példák a transzformációkra}

\begin{figure}[H]
	\includegraphics[width = \linewidth]{pics/kepernyokep/pelda_osszes_el.png}
	\caption{Összes él példa}
\end{figure}

\begin{figure}[H]
	\includegraphics[width = \linewidth]{pics/kepernyokep/pelda_dombornyomat.png}
	\caption{Dombornyomat példa}
\end{figure}

\subsubsection{Transzformálás megszakítása}
A transzformációk a \verb|Cancel| gombbal megszakíthatók. Ekkor semmilyen információ nem kerül rögzítésre, a transzformáció megáll, utána bármelyik transzformáció újra választható.

Az esetleg előzőleg transzformált kép elveszik.

\subsection{Az eredeti és transzformált kép összehasonlítása}
A transzformáció után a transzformált kép az eredeti mellett jelenik meg.

Nagyítás, kicsinyítés hatására mindkét kép ugyanolyan mértékben módosul, hogy megfigyelhessük a transzformációk hatásait.

A görgetősáv is szinkronban tartja a két képet. Használata esetén mindkét képen ugyanaz a részlet fog látszani.

\subsection{A transzformált kép mentése}
Lehetőségünk van a transzformált kép lementésére BMP vagy JPG formátumban, a \verb|File\Save Image| menüpont segítségével.

\subsection{A transzformált kép újbóli felhasználása}
A lementett képeket újra betölthetjük, újra végezhetünk rajta transzformációkat.

E művelet megkönnyítésére használta az eszköztáron a \verb|<-| ikon, melynek segítségével a transzformált képet átemelhetjük az eredeti kép helyére. Ezek után a transzformáció ezzel a képpel fog tovább dolgozni.

\subsection{A program névjegye}
A program készítéséhez használt keretrendszerről nyerhetünk információt a \verb|About\About| menüpontban.

\subsection{Felugró ablakok, hibaüzenetek}

\subsubsection{Transzformálás vége, megszakítás}
Transzformálás sikeres végrehajtása után egy felugró ablakban kerül jelzésre, hogy minden rendben végrehajtódott, valamint kijelzésre kerül az idő másodpercben, két tizedesjegyre kerekítve.

\begin{figure}[H]
	\centering
	\includegraphics{pics/kepernyokep/sikeres_transzformacio.png}
	\caption{Üzenet a transzformáció sikeres végrehajtásáról}
\end{figure}

Megszakítás esetén felugró ablakban jelzésre kerül, hogy megszakítás történt.

\begin{figure}[H]
	\centering
	\includegraphics{pics/kepernyokep/megszakitott_transzformacio.png}
	\caption{Üzenet a transzformáció megszakításáról}
\end{figure}

\subsubsection{Hibaüzenetek}
A program kezelése során háromféle hibaüzenettel találkozhatunk:
\begin{itemize}
	\item OpenCL error
	\item Runtime error
	\item Unexpected error
\end{itemize}

\paragraph{OpenCL error}
Az OpenCL platform, eszköz beállítása során, valamint az OpenCL segítségével történő transzformálásnál jelentkezhet ez a hibaüzenet.

Oka lehet például:
\begin{itemize}
	\item Nincs megfelelő driver telepítve az OpenCL platformhoz/eszközhöz.
	\item Nincs elegendő memória az OpenCL működéséhez.
\end{itemize}
A hibaüzenet tartalmazza a hiba kódját, ami alapján diagnosztizálható a hiba oka.

\paragraph{Runtime error}
Az alkalmazás futása során valamelyik műveletet nem lehet végrehajtani.
Általában akkor jelentkezik, ha túl nagy képet próbálunk betölteni/transzformálni.

\paragraph{Unexpected error}
Nem várt működés esetén jelentkezik. Nagy valószínűséggel nem áll rendelkezésre elegendő memória valamelyik művelet végrehajtásához. A hibaüzenet után az alkalmazás automatikusan leállítja magát.